#include "hmigraphicsscene.h"
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
#include <QKeyEvent>
#include <QGuiApplication>
#include <QMenu>

// 实现新的构造函数
HmiGraphicsScene::HmiGraphicsScene(QGraphicsView* view, QObject *parent)
    : QGraphicsScene(parent), mode_(NORMAL), view_(view)
{
    // 断言确保传入的 view 是有效的
    Q_ASSERT(view_);
}

// 设置场景模式
void HmiGraphicsScene::setMode(Mode mode)
{
    // 让视图获取焦点，接收键盘事件
    if (mode == CREATEITEM && view_)
    {
        view_->setFocus();
    }
    mode_ = mode;
}

// 设置待创建的组件类型
void HmiGraphicsScene::setComponentType(ComponentType type)
{
    componentType_ = type;
}

// 处理鼠标按下事件
void HmiGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    // 如果不是左键点击，直接调用父类处理（如右键菜单触发）
    if (mouseEvent->button() != Qt::LeftButton)
    {
        QGraphicsScene::mousePressEvent(mouseEvent);
        return;
    }
    // 若当前是创建模式，则处理组件创建逻辑
    if (mode_ == CREATEITEM)
    {
        HmiComponent* item = nullptr;

        switch (componentType_)
        {
        case ComponentType::BUTTON:
        {
            item = new HmiButton();
            break;
        }
        case ComponentType::INDICATOR:
        {
            item = new HmiIndicator();
            break;
        }
        }
        // 如果组件创建成功
        if (item)
        {
            // 设置组件在场景中的位置（鼠标点击位置）
            item->setPos(mouseEvent->scenePos());
            addItem(item);
            emit componentCreated(item);
        }
        // 创建完成后切换回正常模式
        setMode(NORMAL);
    }
    else
    {
        // 非创建模式，调用父类默认处理
        QGraphicsScene::mousePressEvent(mouseEvent);
    }
}

// 处理键盘按下事件
void HmiGraphicsScene::keyPressEvent(QKeyEvent *keyEvent)
{
    // 退出创建模式
    if (keyEvent->key() == Qt::Key_Escape && mode_ == CREATEITEM)
    {
        setMode(NORMAL);
        keyEvent->accept();
        return;
    }

    // 若没有选中任何项，调用父类处理
    if (selectedItems().isEmpty())
    {
        QGraphicsScene::keyPressEvent(keyEvent);
        return;
    }
    // 处理特定按键操作
    switch (keyEvent->key())
    {
    case Qt::Key_Delete:
    {
        emit deleteRequestFromScene();
        keyEvent->accept();
        break;
    }
    case Qt::Key_C:
    {
        // 检查是否同时按下了Ctrl
        if (keyEvent->modifiers() & Qt::ControlModifier)
        {
            emit copyRequestFromScene();
            keyEvent->accept();
        }
        break;
    }
    case Qt::Key_V:
    {
        if (keyEvent->modifiers() & Qt::ControlModifier)
        {
            // 获取粘贴位置，将全局鼠标位置转换为场景坐标
            QPointF pastePos = view_->mapToScene(view_->mapFromGlobal(QCursor::pos()));
            emit pasteRequestFromScene(pastePos);
            keyEvent->accept();
        }
        break;
    }
    default:
    {
        break;
    }
    }
    // 调用父类处理剩余按键逻辑
    // 仅处理未被接受的事件
    if (!keyEvent->isAccepted())
    {
        QGraphicsScene::keyPressEvent(keyEvent);
    }
}

// 处理右键菜单事件
void HmiGraphicsScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent)
{
    // 检查鼠标下方是否有图形项
    QGraphicsItem *item = itemAt(contextMenuEvent->scenePos(), view_->transform());
    // 如果点击在空白处，则显示粘贴菜单
    if (!item)
    {
        contextMenuEvent->accept();
        QMenu menu;
        QAction *paste = menu.addAction("粘贴");
        // 将菜单动作连接到场景的粘贴请求信号
        connect(paste, &QAction::triggered, this, [this, contextMenuEvent]() {
            emit pasteRequestFromScene(contextMenuEvent->scenePos());
        });
        // 在鼠标位置显示菜单
        menu.exec(contextMenuEvent->screenPos());
    }
    else
    {
        // 如果点击在图形项上，调用 HmiComponent::contextMenuEvent
        QGraphicsScene::contextMenuEvent(contextMenuEvent);
    }
}
